package com.kgc.rb.common.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.kgc.rb.common.exception.CommonException;
import com.kgc.rb.common.tools.EmptyUtils;
import com.kgc.rb.common.tools.PrintTools;
import com.kgc.rb.dto.RbResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 判断是否登录的拦截器
 *
 * @author Administrator
 */
public class LoginInterceptor implements HandlerInterceptor {//这个类现在并不在Spring IOC的管辖范围之内

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 在控制器处理请求之前会执行的方法
     *
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println("进入了LoginInterceptor拦截器。。。。。。。。。。。。");
        //设置响应头解决跨域问题
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setContentType("text/html;charset=UTF-8");
        RbResult rbResult = null;
        PrintTools printTools = new PrintTools(response);
        //1.获取token，这个token不是设置在请求头中的，而是作为参数传递过来的
        //如果是设置在请求头中获取的方式为request request.getHeader("token");
        //如果是作为请求参数传递过来的获取方式为：
        String token = request.getParameter("token");
        if (EmptyUtils.isEmpty(token)) {//token本身为空
            rbResult = RbResult.build(CommonException.USER_NO_LOGIN.getCode(),
                    CommonException.USER_NO_LOGIN.getMessage());
            //reResult对象返回到前端
            printTools.print(JSONObject.toJSON(rbResult));
            return false;
        }

        //2.根据token去redis中查询
        Object qgUser  = redisTemplate.opsForValue().get(token);
        //3.判断根据token去redis中查询出来的时候是否为空，如果为空表示没有登录，否则表示已经登录
        if (qgUser == null) {//说明没有登录或者是登录失效
            rbResult = RbResult.build(CommonException.USER_NO_LOGIN.getCode(),
                    CommonException.USER_NO_LOGIN.getMessage());
            //reResult对象返回到前端
            printTools.print(JSONObject.toJSON(rbResult));
            return false;
        }
        return true;
    }

    /**
     * 控制器执行完请求还没有返回ModelAndView之前会执行的方法
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 控制器处理完请求之后会执行的方法
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
